package com.liao.common.doc;

/**
 * @Author: ljt
 * @Description: es商品文档
 * @DateTime: 2025/3/12 下午4:44
 **/

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.liao.common.entity.product.CategoryEntity;
import com.liao.common.entity.product.ProductEntity;
import com.liao.common.entity.product.SkuAttributeEntity;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL) // 忽略空字段
public class ProductDoc {

    /**
     * 商品唯一标识（ES keyword 类型）
     */
    @JsonProperty("product_id")
    private Integer productId;

    /**
     * 类目ID（ES keyword 类型）
     */
    @JsonProperty("category_id")
    private Integer categoryId;

    /**
     * 类目名称（ES binary 类型，使用 Base64 编码存储）
     * 注意：可能需要配合 @JsonSerialize 自定义序列化
     */
    @JsonProperty("category_name")
    private String categoryName;

    /**
     * 商品标题（ES text 类型，使用 ik_smart 分词）
     */
    @JsonProperty("title")
    private String title;

    /**
     * 商品描述（ES text 类型，使用 ik_smart 分词）
     */
    @JsonProperty("description")
    private String description;

    /**
     * 主图URL（ES keyword 类型，不参与索引）
     */
    @JsonProperty("main_image")
    private String mainImage;

    /**
     * 商品基础价格（单位：分，ES integer 类型）
     */
    @JsonProperty("base_price")
    private BigDecimal basePrice;

    /**
     * 商品状态（ES keyword 类型）
     * 示例：ON_SALE / OFF_SHELF
     */
    @JsonProperty("status")
    private String status;

    /**
     * 商品销量（ES integer 类型）
     */
    @JsonProperty("sale_count")
    private Integer saleCount;

    /**
     * 商品浏览量（ES integer 类型）
     */
    @JsonProperty("view_count")
    private Integer viewCount;

    /**
     * SKU属性（ES text 类型，使用 ik_smart 分词）
     * 示例："颜色:白色|尺寸:XL"
     */
    @JsonProperty("sku_attr")
    private String skuAttr;

    // 无参构造函数（ES 反序列化必需）
    public ProductDoc() {
    }

    // 全参构造函数（Builder 模式可选）
    public ProductDoc(ProductEntity productEntity, CategoryEntity categoryEntity, List<SkuAttributeEntity> skuAttributeEntityList) {
        this.productId = productEntity.getProductId();
        this.categoryId = categoryEntity.getCategoryId();
        this.categoryName = categoryEntity.getName();
        this.title = productEntity.getTitle();
        this.description = productEntity.getDescription();
        this.mainImage = productEntity.getMainImage();
        this.basePrice = productEntity.getBasePrice();
        this.status = productEntity.getStatus().toString();
        this.saleCount = productEntity.getSaleCount();
        this.viewCount = productEntity.getViewCount();

        StringBuilder skuAttrBuilder = new StringBuilder();
        for (SkuAttributeEntity skuAttribute : skuAttributeEntityList) {
            skuAttrBuilder.append(skuAttribute.getAttrName()).append(":").append(skuAttribute.getAttrValues()).append("|");
        }

        this.skuAttr = skuAttrBuilder.toString();
    }

    // Getter/Setter 省略（可用 Lombok @Data 简化）

    // 重点字段注意事项：
    // 1. category_name 字段若实际存储字符串，建议改用 String 类型并修改映射为 text/keyword
    // 2. 价格建议使用整数类型避免精度问题
    // 3. copy_to 字段 'all' 由 ES 自动处理，无需在实体类体现

    @Override
    public String toString() {
        return "ProductDoc{" +
                "productId='" + productId + '\'' +
                ", categoryId='" + categoryId + '\'' +
                ", categoryName='" + categoryName + '\'' +
                ", title='" + title + '\'' +
                ", description='" + description + '\'' +
                ", mainImage='" + mainImage + '\'' +
                ", basePrice=" + basePrice +
                ", status='" + status + '\'' +
                ", viewCount=" + viewCount +
                ", skuAttr='" + skuAttr + '\'' +
                '}';
    }
}